#pragma once 
#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdio>
#include <set>
class CommandClass
{
public:
    CommandClass()
    {
        _witelist.insert("ls");
        _witelist.insert("ls -al");
        _witelist.insert("ls -al --color");
        _witelist.insert("pwd");
        _witelist.insert("ps");
    }
    //ls -a -b -c -d -e 
    //正常解法：
    /*
    1/ 创建管道 (pipe) + 创建子进程   fork()
    2. 子进程执行命令 execv?
    3. 把结果输出到屏幕当中 => 返回给父进程 dup2(fd,1)
    */
    std::string CommandStr(std::string& cmdstr)
    {
        if (_witelist.find(cmdstr) == _witelist.end()) return "操作不合法";
        FILE* ret = popen(cmdstr.c_str(),"r");//如果传入的是错误的命令，并不会返回nullptr，而是直接打印一条错误信息?
        if (!ret) return "不可以创建子进程或者系统资源不足\n"; 
        std::string result;
        char buffer[1024];
        while(fgets(buffer,sizeof(buffer),ret))
        {
            result += buffer;
        }   
        //把最后的\n去掉
        if (!result.empty() && result.back() == '\n') result.pop_back();
        else if(result.empty()) return "command not found\n";
        
        return result;  
    }
private:
    std::set<std::string> _witelist;
};